デフォルトのドラッグスクロールデバイス
まとめ
ScrollBehavior
指定した場所からのドラッグスクロールを許可または禁止できるようになりましたPointerDeviceKind
s.ScrollBehavior.dragDevices
、デフォルトでは、
スクロールウィジェットを全員がドラッグできるようにしますPointerDeviceKind
s
を除いてPointerDeviceKind.mouse
。
コンテクスト
この変更が行われる前は、すべてPointerDeviceKind
をドラッグできますScrollable
ウィジェット。
これは、Flutter を操作する際の開発者の期待と一致しませんでした
マウス入力デバイスを使用するアプリケーション。これも実行を困難にしました
他のマウス ジェスチャ (テキストに含まれるテキストの選択など)Scrollable
ウィジェット。
さて、受け継がれたのは、ScrollBehavior
どのデバイスがスクロール ウィジェットをドラッグできるかを管理します
によって指定されるようにScrollBehavior.dragDevices
。このセットは、PointerDeviceKind
は
ドラッグすることが許可されています。
変更内容の説明
この変更により、マウスのドラッグによる予期しないスクロール機能が修正されました。
アプリケーション内の以前の動作に依存している場合は、いくつかの方法があります。 この機能を制御および設定します。
-
拡張する
ScrollBehavior
、MaterialScrollBehavior
、 またCupertinoScrollBehavior
デフォルトの動作を変更してオーバーライドするScrollBehavior.dragDevices
。- あなた自身のもので
ScrollBehavior
、設定することでアプリ全体に適用できますMaterialApp.scrollBehavior
またCupertinoApp.scrollBehavior
。 - または、特定のウィジェットにのみ適用したい場合は、
ScrollConfiguration
問題のウィジェットの上にある カスタムScrollBehavior
。
- あなた自身のもので
スクロール可能なウィジェットはこの動作を継承し、反映します。
- 自分で作成するのではなく、
ScrollBehavior
、別の変更オプション デフォルトの動作では、既存のScrollBehavior
、異なる設定dragDevices
。- を作成します
ScrollConfiguration
ウィジェット ツリーに追加し、変更したコピーを提供します 既存のScrollBehavior
現在のコンテキストで使用するcopyWith
。
- を作成します
ドラッグデバイスの新しい構成に対応するにはScrollBehavior
、GestureDetector.kind
とともに廃止されました
パラメータのすべてのサブクラス化されたインスタンス。
既存のコードを移行するために flutter修正が利用可能です
すべてのジェスチャ検出器に対してkind
にsupportedDevices
。
前のパラメータkind
一つだけ許されるPointerDeviceKind
に
ジェスチャをフィルタリングするために使用されます。
の導入supportedDevices
より多くのことを可能にします
有効な 1 つよりもPointerDeviceKind
。
移行ガイド
ScrollBehavior
あなたのアプリケーションのために
カスタムの設定移行前のコード:
MaterialApp(
// ...
);
移行後のコード:
class MyCustomScrollBehavior extends MaterialScrollBehavior {
// Override behavior methods and getters like dragDevices
@override
Set<PointerDeviceKind> get dragDevices => {
PointerDeviceKind.touch,
PointerDeviceKind.mouse,
// etc.
};
}
// Set ScrollBehavior for an entire application.
MaterialApp(
scrollBehavior: MyCustomScrollBehavior(),
// ...
);
ScrollBehavior
特定のウィジェットの場合
カスタムの設定移行前のコード:
final ScrollController controller = ScrollController();
ListView.builder(
controller: controller,
itemBuilder: (BuildContext context, int index) {
return Text('Item $index');
}
);
移行後のコード:
class MyCustomScrollBehavior extends MaterialScrollBehavior {
// Override behavior methods and getters like dragDevices
@override
Set<PointerDeviceKind> get dragDevices => {
PointerDeviceKind.touch,
PointerDeviceKind.mouse,
// etc.
};
}
// ScrollBehavior can be set for a specific widget.
final ScrollController controller = ScrollController();
ScrollConfiguration(
behavior: MyCustomScrollBehavior(),
child: ListView.builder(
controller: controller,
itemBuilder: (BuildContext context, int index) {
return Text('Item $index');
}
),
);
ScrollBehavior
既存のものをコピーして変更する移行前のコード:
final ScrollController controller = ScrollController();
ListView.builder(
controller: controller,
itemBuilder: (BuildContext context, int index) {
return Text('Item $index');
}
);
移行後のコード:
// ScrollBehavior can be copied and adjusted.
final ScrollController controller = ScrollController();
ScrollConfiguration(
behavior: ScrollConfiguration.of(context).copyWith(dragDevices: {
PointerDeviceKind.touch,
PointerDeviceKind.mouse,
}),
child: ListView.builder(
controller: controller,
itemBuilder: (BuildContext context, int index) {
return Text('Item $index');
}
),
);
GestureDetector
からのkind
にsupportedDevices
移行する移行前のコード:
VerticalDragGestureRecognizer(
kind: PointerDeviceKind.touch,
);
移行後のコード:
VerticalDragGestureRecognizer(
supportedDevices: <PointerDeviceKind>{ PointerDeviceKind.touch },
);
タイムライン
リリースされたバージョン: 2.3.0-12.0.pre
安定版リリース: 2.5
参考文献
API ドキュメント:
ScrollConfiguration
ScrollBehavior
MaterialScrollBehavior
CupertinoScrollBehavior
PointerDeviceKind
GestureDetector
関連する問題:
- 問題 #71322
関連する PR:
- スクロール可能でデフォルトでマウスのドラッグを拒否する
- 新しい SupportedDevices を優先して GestureDetector.kind を非推奨にします